<?php
#+------------------------------------------------------------------
#| 我曾七次鄙视自己的灵魂:
#| 第一次,当它本可进取时，却故作谦卑；
#| 第二次,当它空虚时，用爱欲来填充；
#| 第三次,在困难和容易之间，它选择了容易；
#| 第四次,它犯了错，却借由别人也会犯错来宽慰自己；
#| 第五次,它自由软弱，却把它认为是生命的坚韧；
#| 第六次,当它鄙夷一张丑恶的嘴脸时，却不知那正是自己面具中的一副；
#| 第七次,它侧身于生活的污泥中虽不甘心，却又畏首畏尾。
#+------------------------------------------------------------------
#| Author:Janmas Cromwell <janmas-cromwell@outlook.com>
#+------------------------------------------------------------------
namespace app\common\lib\queue;

use app\common\lib\RedisManage;
use app\common\model\ShortUrlLog;
use think\facade\Queue;
use think\migration\command\migrate\Status;
use think\queue\Job;

/**
 * @property \Redis $redis
 */
class OperaShortUrl
{
    protected $redis;

    /**
     * @param Job $job
     * @param $data
     *  [
     *      ids,需要操作的对象
     *      opera 操作类型
     * ]
     */
    public function fire(Job $job, $data)
    {
        $opera = $data['opera'];
        echo '------------------------------------------------------------------------------' . PHP_EOL;
        echo date('Y-m-d H:i:s') . PHP_EOL;
        echo "操作队列开始执行" . PHP_EOL;
        echo '当前操作类型:[' . $opera . ']' . PHP_EOL;
        echo '操作的对象:[' . implode(',', $data['ids']) . ']' . PHP_EOL;

        $redis = RedisManage::instance()->getRedis();
        echo "redis连接状态：" . $redis->isConnected() . PHP_EOL;
        $redis->select(1);
        $where[] = ['id', 'in', $data['ids']];
        $list = ShortUrlLog::field('id,short_code,url,expire_time,create_time,scene,user_id,status')->where($where)->select();
        echo 'SQL：' . ShortUrlLog::getLastSql() . PHP_EOL;

        if (!$list) {
            $job->delete();
            return;
        }

        foreach ($list as $item) {
            echo "开始执行操作-" . PHP_EOL;
            if ($item->expire_time < time() && $item->scene != ShortUrlLog::PERMANENT) {
                $item->status = ShortUrlLog::STATUS_OVERDUE;
                $item->save();
                if ($redis->exists($item->short_code)) {
                    $redis->del($item->short_code);
                }
                echo '该数据过期 redis已删除、Db已更改,short_code:[' . $item->short_code . ']' . PHP_EOL;
            } else if ($redis->exists($item->short_code)) {
                if ($opera == 'del') {
                    $redis->del($item->short_code);
                    echo "[{$item->short_code}]{$opera}操作执行完毕" . PHP_EOL;
                } else {
                    echo "状态：".$item->status . PHP_EOL;
                    $redis->hSet($item->short_code,'status',$item->status);
                    echo "[{$item->short_code}]{$opera}操作执行完毕" . PHP_EOL;
                }
            } else if ($opera = 'open') {
                $hashKeys = $item->toArray();
                unset($hashKeys['id']);
                $hashKeys['type'] = 'user';
                $redis->hMSet($item->short_code, $hashKeys);
                Queue::later($item->expire_time-time(), OverdueShorturl::class, $item, 'OVERDUE_SHORTURL');
                echo "[{$item->short_code}]启用操作执行完毕1" . PHP_EOL;
            }
        }

        echo '--------------------------------------------------------------------------------------' . PHP_EOL;
        echo PHP_EOL;
        $job->delete();
    }

}